diff --git a/django/core/handlers/asgi.py b/django/core/handlers/asgi.py
index 569157b277..3a758c4869 100644
--- a/django/core/handlers/asgi.py
+++ b/django/core/handlers/asgi.py
@@ -189,23 +189,27 @@ class ASGIHandler(base.BaseHandler):
 
     async def read_body(self, receive):
         """Reads an HTTP body from an ASGI connection."""
-        # Use the tempfile that auto rolls-over to a disk file as it fills up.
+        # Create the tempfile for the request body
         body_file = tempfile.SpooledTemporaryFile(
             max_size=settings.FILE_UPLOAD_MAX_MEMORY_SIZE, mode="w+b"
         )
-        while True:
-            message = await receive()
-            if message["type"] == "http.disconnect":
-                body_file.close()
-                # Early client disconnect.
-                raise RequestAborted()
-            # Add a body chunk from the message, if provided.
-            if "body" in message:
-                body_file.write(message["body"])
-            # Quit out if that's the end.
-            if not message.get("more_body", False):
-                break
-        body_file.seek(0)
+        try:
+            while True:
+                message = await receive()
+                # Handle body chunks
+                if "body" in message:
+                    body_file.write(message["body"])
+                # Handle disconnect
+                if message["type"] == "http.disconnect":
+                    raise RequestAborted()
+                # Break if no more body
+                if not message.get("more_body", False):
+                    break
+        except RequestAborted:
+            body_file.close()
+            raise
+        finally:
+            body_file.seek(0)
         return body_file
 
     def create_request(self, scope, body_file):
